class OpcaoDipj < ActiveRecord::Base

  # Attributes
  belongs_to :caracterizacao
  validates_presence_of :caracterizacao
  attr_readonly :caracterizacao_id

  # Validation
  validates_numericality_of :ano_apuracao, :ano_dipj, :only_integer => true, :in => 1900..Time.now.year
  validates_numericality_of :reducao, :greater_than => 0

  validates_uniqueness_of :ano_apuracao, :scope => :caracterizacao_id

  validate :ano_dipj_maior_ou_igual_ano_apuracao, :reducao_menor_depositos_mesmo_ano

  default_scope :order => :ano_apuracao

  def ano_dipj_maior_ou_igual_ano_apuracao
    if ano_apuracao && ano_dipj && ano_apuracao >= ano_dipj
      errors.add_to_base("Ano de Apuração deve ser anterior ao da DIPJ")
    end
  end

  def reducao_menor_depositos_mesmo_ano
    depositos_mesmo_ano = caracterizacao.depositos.totais_por_ano.select {|r| r.ano == ano_apuracao }
    if depositos_mesmo_ano.empty?
      errors.add_to_base("Não foram encontrados depósitos para o ano de #{ano_apuracao}.")
    elsif reducao > depositos_mesmo_ano.sum(&:valor)
      errors.add_to_base("A Redução por Reinvestimento não pode ser maior que a soma dos depósitos do mesmo ano.")
    end
  end

end
